package com.mystatusonline.webapp.filter;

import java.util.Collections;
import java.util.Enumeration;
import java.util.List;
import java.util.Locale;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;


/**
 * HttpRequestWrapper overriding methods getLocale(), getLocales() to include
 * the user's preferred locale.
 */
public class LocaleRequestWrapper
  extends HttpServletRequestWrapper {

  private final transient Log log = LogFactory
    .getLog(LocaleRequestWrapper.class);
  private final Locale preferredLocale;

  /**
   * Sets preferred local to user's locale
   *
   * @param decorated the current decorated request
   * @param userLocale the user's locale
   */
  public LocaleRequestWrapper(final HttpServletRequest decorated,
                              final Locale userLocale) {
    super(decorated);
    preferredLocale = userLocale;
    if (null == preferredLocale) {
      log.error("preferred locale = null, it is an unexpected value!");
    }
  }

  /**
   * {@inheritDoc}
   */
  public Locale getLocale() {
    if (null != preferredLocale) {
      return preferredLocale;
    } else {
      return super.getLocale();
    }
  }

  /**
   * {@inheritDoc}
   */
  @SuppressWarnings("unchecked")
  public Enumeration<Locale> getLocales() {
    if (null != preferredLocale) {
      List<Locale> l = Collections.list(super.getLocales());
      if (l.contains(preferredLocale)) {
        l.remove(preferredLocale);
      }
      l.add(0, preferredLocale);
      return Collections.enumeration(l);
    } else {
      return super.getLocales();
    }
  }

}
